• 问题

    先来看一个反例:

    private final List<Cheese> cheesesInStock = ...;
    public Cheese[] getCheeses(){
       if (cheesesInStock.size == 0)
           return null;
    }
    

    调用方客户端代码:

    Cheese[] cheeses  = shop.getCheeses();
    if(cheeses != null && Arrays.asList(cheeses).contains(Cheese.STILTON)){
        System.out.println("Jolly good,just the thing.") ;
    }
    

    也就是说由于cheesesInStock在特殊情况下返回了null,因此,给调用方增加了额外的判断为null的代码,而从业务意义上来说,null一般是指异常情况下的返回值,那么,针对返回值为集合或者数组来说,特殊情况下应该返回什么?

  • 解决

    1. 对于方法如果返回为null,则调用方每一次都要去判断是否为null,从而解决NullPointException。因此,方法返回类型是数组或者集合时,特殊情况不应该返回null,而是应该返回一个空的集合或者数组。

    2. 有时候会有人认为:null返回值比零长度数组更好,因为它避免了分配数组所需要的开销。这种观点是站不住脚的,原因有两点。第一这个级别上担心性能问题是不明智的,除非分析表明这个方法正是造成性能问题的真正源头。第二每次都返回同一个零长度数组有可能的,因为零长度数组是不可变的,而不可变的对象有可能被自由的共享。

      将上例进行修改:

      public List<Cheese> getCheeseList(){
        if(cheeseInStock.isEmpt())
          return Collections.emptyList();//Always return same list
        else
          return new ArrayList<Cheese>(cheesesInStock);
      }
      
  • 结论

    返回类型为数组或者集合的方法没理由返回null,而应该返回一个长度为零的数组或者集合。

results matching ""

    No results matching ""